<?php

class Evaluation extends AppModel
{

    var $name = 'Evaluation';
    var $belongsTo = array('User', 'Article');

    function setStatus($articleId, $userId, $status)
    {
        $this->query("UPDATE `evaluations` SET `status` = '$status' WHERE `evaluations`.`article_id` =$articleId AND `evaluations`.`user_id` =$userId");
    }

    function distributeArticles($evaluationsNumber, $articles)
    {
        foreach ($articles as $article):
            for ($i = 1; $i <= $evaluationsNumber; $i++):
                // Seleciona todos os avaliadores da área do artigo que ainda
                // não receberam o artigo atual para avaliar
                $allEvaluators = $this->query("
                    SELECT `user_id`
                    FROM `areas_users`
                    WHERE `area_id` ={$article['Article']['area_id']}
                        AND NOT `user_id`
                    IN (
                        SELECT `user_id`
                        FROM `evaluations`
                        WHERE `article_id` ={$article['Article']['id']}
                    )
                    ", $cachequeries = false);

                // Se encontrar avaliadores que ainda não receberam o arquivo atual, continua

                if (!empty($allEvaluators)) {
                    foreach ($allEvaluators as $ev) {
                        $e[$ev['areas_users']['user_id']] = 0;
                    }

                    // Seleciona o avaliador da área do artigo que tem menos artigos
                    // para avaliar até o momento e que ainda não recebeu o artigo atual
                    $evaluator = $this->query("
                        SELECT COUNT( `user_id` ) as `count` , `user_id`
                        FROM `evaluations` AS `Evaluation`
                        WHERE `user_id`
                        IN (
                            SELECT `user_id`
                            FROM `areas_users`
                            WHERE `area_id` ={$article['Article']['area_id']}
                        )
                        AND NOT `user_id`
                        IN (
                            SELECT `user_id`
                            FROM `evaluations`
                            WHERE `article_id` ={$article['Article']['id']}
                        )
                        GROUP BY `user_id`
                        ORDER BY `count` ASC
                    ", $cachequeries = false);

                    if (!empty($evaluator)) {
                        foreach ($evaluator as $k => $ev2)
                            $e[$evaluator[$k]['Evaluation']['user_id']] = $evaluator[0][0]['count'];
                    }

                    asort($e);
                    reset($e);
                    current($e);

                    $evaluatorId = key($e);
                    unset($e);

                    // Verifica se o avaliador já está inscrito no congresso
                    $check = $this->query("
                        SELECT *
                        FROM `congresses_users`
                        WHERE `user_id` =$evaluatorId
                            AND `congress_id` ='{$article['Article']['congress_id']}'
                    ", $cachequeries = false);

                    // Se não está, inscreve o avaliador no congresso
                    if (empty($check)) {
                        $this->query("
                           INSERT INTO `congresses_users` (
                                `congress_id` ,
                                `user_id`
                           )
                           VALUES (
                                '{$article['Article']['congress_id']}',
                                $evaluatorId
                           )"
                        );
                    }

                    // Atribui o artigo para o avaliador
                    $this->create();
                    $this->save(array(
                        'Evaluation' => array(
                            'article_id' => $article['Article']['id'],
                            'user_id' => $evaluatorId,
                        )
                    ));
                }
            endfor;
        endforeach;
    }

}

?>
